package org.skywork.dal.basic;

// *************************************************************************/
// Charada Soft
// Area de Desarrollo de Sistemas de Información
// *************************************************************************/
// Proyecto : SkyWork Data Access Layer
// Archivo : PersonaDAO.java
// Descripcion : Clase PersonaDAO
// *************************************************************************/
// Version : 2.11.8
// Fecha de Creación: 31 de Diciembre de 2014
// Author : Daniel Andres Castillo Pedroza
// *************************************************************************/

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import org.skywork.dal.SkyWorkDAO;
import org.skywork.entitys.basic.Persona;
import org.sql.commands.exception.DMLException;
import org.sql.commands.mysql.clause.Where;
import org.sql.commands.mysql.command.Insert;
import org.sql.commands.mysql.command.Select;
import org.sql.commands.mysql.filter.Condition;

public class PersonaDAO extends SkyWorkDAO <Persona> {
    
    // Atributos estáticos de la clase PersonaDAO
    
    private static final String COMMAND_POR_CEDULA = "COMANDO POR CEDULA";
    
    // Atributos de la clase PersonaDAO
    
    private final String NAME_TABLE = "PERSONA";
    private final int NUMBER_COLUMNS = 9;
    
    // Nombre de Columnas de la tabla Persona en Base de Datos
    
    public static final String CEDULA = "CEDULA";
    public static final String EXPEDICION = "EXPEDICION";
    public static final String NOMBRES = "NOMBRE";
    public static final String PRIMER_APELLIDO = "P_APELLIDO";
    public static final String SEGUNDO_APELLIDO = "S_APELLIDO";
    public static final String DIRECCION = "DIRECCION";
    public static final String BARRIO = "BARRIO";
    public static final String CELULAR = "CELULAR";
    public static final String CORREO = "CORREO";
    
    // Metodos de la clase PersonaDAO
    
    /**
     * Este metodo nos permite ejecutar el registro de una Persona en la Base de
     * Datos del Sistema. Donde la persona se establece con un objeto <code>Persona</code>.
     * 
     * @param persona Objeto que contiene los datos de la Persona
     * @return Retorna el resultado del proceso en un dato <code>boolean</code>.
     * @throws SQLException Se lanzara esta excepción cuando ocurra errores SQL.
     * @throws DMLException Se lanzara esta excepción cuando ocurra errores DML.
     */
    public static boolean registrar(Persona persona) throws SQLException, DMLException {
        return new PersonaDAO().insert(persona);
    }
    
    /**
     * Este método nos permite ejecutar la busqueda de la Persona en la Base
     * de Datos de Sistema atraves de su cedula. Donde la cédula para realizar consulta
     * se establece con un objeto <code>String</code>.
     * 
     * @param cedula Cédula para identificar Persona en el Sistema
     * @return Retorna la persona en un objeto <code>Persona</code>.
     * @throws SQLException Se lanzara esta excepción cuando ocurra errores SQL.
     * @throws DMLException Se lanzara esta excepción cuando ocurra errores DML.
     */
    public static Persona buscarPorCedula(String cedula) throws SQLException, DMLException {
        TIPO_COMANDO = COMMAND_POR_CEDULA; // Tipo de Comando
        return new PersonaDAO().selectUnique(cedula);
    }
    
    // Metodos sobreescritos de la clase PersonaDAO

    @Override
    protected ArrayList generateDataInsert(Persona object) {
        // Instanciando Array para contener los datos 
        ArrayList entidadDatos = new ArrayList();
        
        // Cargando datos a insertar en el Array
        entidadDatos.add(object.getIdentificacion());
        entidadDatos.add(object.getExpedicion());
        entidadDatos.add(object.getNombres());
        entidadDatos.add(object.getPrimerApellido());
        entidadDatos.add(object.getSegundoApellido());
        entidadDatos.add(object.getDireccion());
        entidadDatos.add(object.getBarrio());
        entidadDatos.add(object.getCelular());
        entidadDatos.add(object.getCorreo());
        
        return entidadDatos; // Datos para Insertar
    }

    @Override
    protected Insert generateInsert() {
        return Insert.creatorCommand(NAME_TABLE,NUMBER_COLUMNS);
    }

    @Override
    protected Select generateSelect() {
        Select select = new Select(); // Creando sentencia de Busqueda
        
        switch (TIPO_COMANDO) {
            // Busqueda de Arrendatario por Cédula en el Sistema
            case (COMMAND_POR_CEDULA) :
                select.addColumn("*"); select.addTable(NAME_TABLE); 
                
                WHERE = new Where(); // Clausula del Comando
                WHERE.addFilter(Condition.creatorFilter(CEDULA + " = ?"));
                select.addClause(WHERE); // Agregando clausula al Comando
            break;
        } // Definiendo el tipo de Sentencia para realizar Busqueda
        
        return select; // Retornando Comando de Selección
    }

    @Override
    protected Persona generateObject(ResultSet result) throws SQLException {
        // Instanciando objeto a contener Persona
        Persona persona = new Persona(result.getString(CEDULA));
        
        // Cargando información de la Persona en el objeto
        persona.setExpedicion(result.getString(EXPEDICION));
        persona.setNombres(result.getString(NOMBRES));
        persona.setPrimerApellido(result.getString(PRIMER_APELLIDO));
        persona.setSegundoApellido(result.getString(SEGUNDO_APELLIDO));
        persona.setDireccion(result.getString(DIRECCION));
        persona.setBarrio(result.getString(BARRIO));
        persona.setCelular(result.getString(CELULAR));
        persona.setCorreo(result.getString(CORREO));
        
        return persona; // Retornando persona del Sistema
    }
}